package com.example.littleken.musictextend;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;

/**
 * 本类封装了安卓6.0（API 23）之后的权限动态获取方法
 * 本类主要提供两个方法
 *                      check()获取权限，返回true为获取到全部权限
 *                      onRequestPermissionsResult()处理系统返回信息，返回true为获取到全部权限
 * 使用本类需要提供4个参数
 *                      Context context 系统上下文
 *                      String[] perssion 指定权限数组
 *                      int MY_PERMISSION_REQUEST_CODE 请求码
 *                      String checkFailMsg 权限请求失败提示信息
 * Created by littleken on 2018/4/24.
 */

public class checkPermissionGranted {
    //请求码
    private int MY_PERMISSION_REQUEST_CODE ;
    //存放特定权限数组
    private String[] perssion;
   /* //界面类，目前不完善，我之后在看看有没有方法通过泛型或者Context上下文来获取到本界面
    private MainActivity mainActivity;*/
    private Context context;
    //权限获取失败提示信息
    private String checkFailMsg;

    /**
     * 本类构造器
     * @param context 上下文
     * @param perssion 指定权限数组
     * @param MY_PERMISSION_REQUEST_CODE 请求码
     * @param checkFailMsg 请求失败提示信息
     */
    public checkPermissionGranted(Context context,String[] perssion,int MY_PERMISSION_REQUEST_CODE,String checkFailMsg ) {
        this.MY_PERMISSION_REQUEST_CODE = MY_PERMISSION_REQUEST_CODE;
        this.perssion = perssion;
        this.context = context;
        this.checkFailMsg = checkFailMsg;
    }

    /**
     * 检测是否全部拥有指定的权限
     * @param permissions 权限数组
     * @return 全部拥有返回true 其他返回false
     */
    private boolean checkPermissionAllGranted(String[] permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                // 只要有一个权限没有被授予, 则直接返回 false
                return false;
            }
        }
        return true;
    }

    /**
     * 若安装时以获取到指定权限，则返回，否则动态获取
     */
    public boolean check(){
        boolean isAllGranted = checkPermissionAllGranted(perssion);
        if (isAllGranted) {
            // TODO: 2018/4/24 成功获取权限
            return true;
        }else{
            /**
             * 请求权限,一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉
             * @param mainActivity 界面类
             * @param perssion 权限数组
             * @param MY_PERMISSION_REQUEST_CODE 请求码
             */
            ActivityCompat.requestPermissions((Activity) context, perssion, MY_PERMISSION_REQUEST_CODE
            );
        }

        return false;
    }


    /**
     * 处理系统在权限申请后的返回消息
     * @param requestCode  请求码
     * @param permissions  权限数组
     * @param grantResults 权限申请结果
     */
    public boolean onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
        if (requestCode == MY_PERMISSION_REQUEST_CODE) {
            boolean isAllGranted = true;

            // 判断是否所有的权限都已经授予了
            for (int grant : grantResults) {
                if (grant != PackageManager.PERMISSION_GRANTED) {
                    isAllGranted = false;
                    break;
                }
            }

            if (isAllGranted) {
                // TODO: 2018/4/24 该干嘛干嘛
                return true;

            } else {
                // 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
                openAppDetails();
            }
        }
        return false;
    }

    /**
     * 打开手动权限设置
     */
    private void openAppDetails() {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(checkFailMsg);
        builder.setPositiveButton("去手动授权", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.setData(Uri.parse("package:" + context.getPackageName()));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                context.startActivity(intent);
            }
        });
        //按取消app直接退出
/*        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mainActivity.finish();
            }
        });*/
        builder.setNegativeButton("取消",null);
        builder.show();
    }
}
